import java.awt.*;
/**La clase Data agrupa todas la categorias de datos y
 * proporciona funciones para acceder a cada una.*/
public class Data extends DataCategory
{
    /**Crea un nuevo objeto de tipo Data inicializando
     * todas las categorías.*/
    public Data() 
    {
        machineOperation = new MachineOperation();
        pathPlanning = new PathPlanning();
        axisMotion = new AxisMotion();
        programExecution = new ProgramExecution();
        spindle = new Spindle();
        atc = new Atc();
        devices = new Devices();
        toolHolder = new ToolHolder();
    }
    /**
     * Comunica los valores iniciales a la categoria de datos 
     * correspondiente.
     * @param id identificador del dato
     * @param value valor del dato
     */
    public boolean initData(int id,int value)
    {
        for(int i = 0; i < getTotalCategory(); i++)
            if(getCategory(i).initData(id,value))
                return true;
        return false;
    }
    public boolean initData(int id,long value)
    {
        for(int i = 0; i < getTotalCategory(); i++)
            if(getCategory(i).initData(id,(long)value))
                return true;
        return false;
    }
    public Component getView(Id viewID)
    {
        return getCategory(viewID.getCategory()).getView(viewID);
    }
    public Component getEditor(Id editorID)
    {
        return getCategory(editorID.getCategory()).getEditor(editorID);
    }
    public String getDataCategoryID()
    {
        return "data";
    }
    public String getValue(Id dataID)
    {
        return getCategory(dataID.getCategory()).getValue(dataID);
    }
    public boolean setCommandValue(int id,int value)
    {
        for(int i = 0; i < getTotalCategory(); i++)
            if(getCategory(i).setCommandValue(id,value))
                return true;
        return false;
    }
    public boolean setCommandValue(int id,long value)
    {
        for(int i = 0; i < getTotalCategory(); i++)
            if(getCategory(i).setCommandValue(id,(long)value))
                return true;
        return false;
    }
    public boolean setDataValue(int id,int value)
    {
        for(int i = 0; i < getTotalCategory(); i++)
            if(getCategory(i).setDataValue(id,value))
                return true;
        return false;
    }
    public boolean setDataValue(int id,long value)
    {
        for(int i = 0; i < getTotalCategory(); i++)
            if(getCategory(i).setDataValue(id,(long)value))
                return true;
        return false;
    }
    public void applyChange()
    {
        for(int i = 0; i < getTotalCategory(); i++)
            getCategory(i).applyChange();
    }
    public void cancelChange()
    {
        for(int i = 0; i < getTotalCategory(); i++)
            getCategory(i).cancelChange();
    }
    /**Proporciona un objeto de la categoría de dato correspondiente
     * al valor establecido en el parámetro.
     * @param value categoría de la cual se quiere un ejemplar.
     * @return un ejemplar de la categoría solicitada.
     */
    public DataCategory getCategory(Category value)
    {
        switch(value)
        {
            case MACHINE_OPERATION:
                return machineOperation;
            case PATH_PLANNING:
                return pathPlanning;
            case AXIS_MOTION:
                return axisMotion;
            case PROGRAM_EXECUTION:
                return programExecution;
            case SPINDLE:
                return spindle;
            case ATC:
                return atc;
            case DEVICES:
                return devices;
            case TOOL_HOLDER:
                return toolHolder;
            default:
                return machineOperation;
        }
    }
    /**Proporciona un objeto de la categoría de dato correspondiente
     * al valor establecido en el parámetro.
     * @param value valor correspondiente a la categoría de la cual se 
     * quiere un ejemplar.
     * @return un ejemplar de la categoría solicitada.
     */
    public DataCategory getCategory(int value)
    {
        switch(value)
        {
            case MACHINE_OPERATION:
                return machineOperation;
            case PATH_PLANNING:
                return pathPlanning;
            case AXIS_MOTION:
                return axisMotion;
            case PROGRAM_EXECUTION:
                return programExecution;
            case SPINDLE:
                return spindle;
            case ATC:
                return atc;
            case DEVICES:
                return devices;
            case TOOL_HOLDER:
                return toolHolder;
            default:
                return null;
        }
    }
    /**Proporciona el número total de categorías existentes.
     */
    public int getTotalCategory()
    {
        return 8;
    }
    /**
     * Comunica los valores iniciales de las compensaciones de trabajo.
     * @param x compensación del eje x.
     * @param y compensación del eje y.
     * @param z compensación del eje z.
     */
    public void initWorkOffset(int x,int y,int z)
    {
        pathPlanning.initWorkOffset(x,y,z);
    }
    /**
     * Comunica los valores iniciales de las compensación de las herramientas
     * presentes.
     * @param lenght compensación de la longitud de la herramienta.
     * @param diameter compensación del diámetro de la herramienta.
     */
    public void initToolOffset(int lenght, int diameter)
    {
        pathPlanning.initToolOffset(lenght,diameter);
    }
    private MachineOperation machineOperation;
    private PathPlanning pathPlanning;
    private AxisMotion axisMotion;
    private ProgramExecution programExecution;
    private Spindle spindle;
    private Atc atc;
    private Devices devices;
    private ToolHolder toolHolder;
}
